package great.project.easyexcel.controller;

import great.project.easyexcel.demo.Student;
import great.project.easyexcel.easyexcel.bo.ExcelErrorMessage;
import great.project.easyexcel.easyexcel.bo.ExcelProgress;
import great.project.common.http.Result;
import great.project.easyexcel.easyexcel.util.ExcelUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

@RestController
public class TestController {

    public final List<Student> DATA_LIST = new ArrayList<>();

    /**
     * <div  style="height:10px;width:200px;font-size:15px;text-align:center;color:red;">
     * <p>
     *  excelUtils
     *
     *  </div>
     */
    @Resource
    private ExcelUtils excelUtils;


    /**
     * 异步导入
     *
     * @return 结果
     */
    @PostMapping("asyncImport")
    public Result<String> asyncImport(MultipartFile file) {

        // 这里写死了，根据具体的业务，自行改
        String creator = "张三";

        return excelUtils.asyncImport(
                // 已经处理好的数据 ， 注意这里是一批数据，每批次攒满之后 就会调该方法，来保存数据
                list -> {
                    // TODO: 2020/12/10 这个是看效果才用的 实际的时候记得关掉 10秒一波

                    try {
                        Thread.sleep(1000*10);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                    DATA_LIST.addAll(list);
                },
                // 解析到的每行数据 这个方法的作用在于 ， 给数据补充内容 ，
                // 例如： 学生导进去了但是excel的内容里，没有导入者这个值的只能后期补进去
                data -> {
                    // 设置导入者
                    data.setCreator(creator);

                },

                /*
                    校验数据
                    data -> 当前数据
                    set -> 用来处理是否重复（如果没有重复选项的话，就不用管）
                    excelErrorMessage -> 错误信息（如果有问题可以设置错误的美容，这个只有返回false的时候有用）
                    返回值 如果没有问题就返回 true ， 有问题返回false
                 */
                (data, set, excelErrorMessage) -> {

                    boolean add = set.add(data.getMobile());

                    // 简单的规则 ， 如果 手机号没传 则错误
                    // 这个不是很智能，嗯。。 有空的话可以优化下

                    String mobile = data.getMobile();

                    if (mobile == null) {

                        excelErrorMessage.setField("手机号");
                        excelErrorMessage.setMsg("手机号码为空");
                        // setRowNumber 不用填
//                        excelErrorMessage.setRowNumber();
                        // 原始数据
                        excelErrorMessage.setValue(mobile);

                        // 一定要返回 false ， 不然 不会记录
                        return false;
                    }

                    return true;
                },
                Student.class,
                file
        );
    }

    /**
     *  这个可以 导出模板
     * @param response 结果
     */
    @GetMapping("export")
    public void export(
            HttpServletResponse response
    ) {
        final long now = System.currentTimeMillis();
        ExcelUtils.simpleExport(response, "简单的导出案例-" + now, Student.class, DATA_LIST);
        DATA_LIST.clear();
    }

    /**
     *  简单的导入
     * @param file 文件
     * @return 好结果
     * @throws IOException 异常
     */
    @PostMapping("simpleImport")
    public Result<String> simpleImport(MultipartFile file) throws IOException {

        List<Student> students = ExcelUtils.simpleImport(file, Student.class);

        boolean b = DATA_LIST.addAll(students);
        if (b) {
            return Result.success();
        }
        return Result.fail();
    }

    /**
     *  到如今进度
     * @param key
     * @return
     */
    @GetMapping("process")
    public Result<ExcelProgress> process(String key){
        return excelUtils.checkProcess(key);
    }

    @GetMapping("exportError")
    public void exportError(
            String key,
            HttpServletResponse response

    ) throws IOException {
        List<ExcelErrorMessage> errorMessage = excelUtils.getErrorMessage(key);
        if (errorMessage==null) {
            return;
//            return Result.fail("暂无数据");
        }
final long now = System.currentTimeMillis();
        ExcelUtils.simpleExport(response, "错误信息"+ now , ExcelErrorMessage.class , errorMessage);

//        return Result.success(errorMessage);
    }

}
